//
//  TSZStatusDAL.swift
//  微博天下
//  Created by Tsz on 15/10/27.

import Foundation

 /// 数据库缓存访问时间的长度
private let dbCacheTime: NSTimeInterval = 60

class TSZStatusDAL {

    //清除数据库缓存
    class func clearDatabaseCache() {
        //1、确定删除缓存时间
        let date = NSDate(timeIntervalSinceNow:  -dbCacheTime)
        
        //转换日期
        let df = NSDateFormatter()
        
        df.locale = NSLocale(localeIdentifier: "en")
        df.dateFormat = "yyyy-MM-dd  HH:mm:ss"
        let dateString = df.stringFromDate(date)
        
        
        //清除数据
         let sql = "DELETE FROM T_Status WHERE createTime < '\(dateString)';"
        
        TSZSQLiteManager.shareManager.queue.inDatabase { (db) -> Void in
            db.executeUpdate(sql)
            
            print("删除成功")
        }
    }
    
    //MARK: 得到模型数据 ，数据库访问 通过本地数据库或者网络
    
    class func loadStatus(since_id: Int, max_id: Int, finished: (array: [[String: AnyObject]]?, error: NSError?)->()) {
            //1、检查本地是否有缓存数据
        loadCacheData(since_id, max_id: max_id) { (array) -> () in
            
            //2、如果有缓存 直接返回
            if (array?.count ?? 0) > 0 {
                finished(array: array, error: nil)
                return
            }
            
            //如果没有缓存加载网络数据
            TSZNetWorkTools.sharedNetWorkTools.loadHomeMicroblog(since_id, max_id: max_id, finised: { (result, error) -> () in
                 //判断能否获得字典数组
                
                if let array = result?["statuses"] as? [[String : AnyObject]] {
                    
                    //完成加载将数据库中的数据保存
                    saveStatus(array)
                    
                    //完成回调
                    finished(array: array, error: nil)

                }else {
                    finished(array: nil, error: error)
                }
            })
        }
    }
    
    //MARK: 加载缓存数据
    class func loadCacheData(since_id: Int, max_id: Int, finished: (array: [[String: AnyObject]]?)->()) {
        //判断 用户是否登录
        assert(TSZUserAcountModel.userLogin, "必须登录才能调用")
        
        let userId = TSZUserAcountModel.sharedUserAccount()!.uid!
        
        //查询的sql语句
        var sql = "SELECT statusId, status, userId FROM T_Status \n" +
        "WHERE userId = \(userId) \n"
        
        //根据参数调整查询条件
        if since_id > 0 {
            sql += "AND statusId > \(since_id) \n"
        }else if max_id > 0 {  // 上拉刷新
            sql += "AND statusId < \(max_id) \n"
        }
         sql += "ORDER BY statusId DESC LIMIT 20;"
        //TODO:  测试了sql语句
//        print(sql)
        
        //查询
        TSZSQLiteManager.shareManager.queue.inDatabase { (db) -> Void in
            
            guard let rs = db.executeQuery(sql)else{
                finished(array: nil)
                return
            }
            
            //生成结果内容 ，返结果
           var array = [[String: AnyObject]]()
            
            //执行sql
            while rs.next() {
                let jsonString = rs.stringForColumn("status")
                // 反序列化
                let dict = try! NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions(rawValue: 0))
                
                // 将字典插入数组
                array.append(dict as! [String: AnyObject])
            }
            
            // 通过回调返回数据
            finished(array: array)
            }
        
        }
    /// 将数据保存到数据库
    /// 1. 确定一下参数 - 从网络获取到的`字典`数组
    /// 2. 确定 SQL
    /// 3. 利用数据库工具，遍历数组，顺序插入数据
    class func saveStatus(array: [[String: AnyObject]]) {
        
        // 判断用户是否登录
        assert(TSZUserAcountModel.userLogin, "必须登录才能调用")
        
        /*
        1. 字段中一定要有主键
        2. 主键一定不是自动增长的，如果是自动增长，INSERT 的时候，无法确定主键
        */
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES (?, ?, ?);"
        
        let userId = TSZUserAcountModel.sharedUserAccount()!.uid!
        
        TSZSQLiteManager.shareManager.queue.inTransaction { (db, rollback) -> Void in
            
            // 1. 遍历数组
            for dict in array {
                // 1> 微博代号
                let statusId = dict["id"] as! Int
                // 2> status 是 字典对应的 JSON 字符串，序列化
                let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions(rawValue: 0))
                let jsonString = NSString(data: json, encoding: NSUTF8StringEncoding)!
                
                // 3> 插入数据
                if !db.executeUpdate(sql, statusId, jsonString, userId) {
                    rollback.memory = true
                    break
                }
            }
            // 2. 输出结果
            print("保存了 \(array.count) 条记录")
        }
    }
    
}
